package day4;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

//反射测试方法
public class TestMethod {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //1.获取类对象
        Class c=Class.forName("day4.Person");
        //2.获取方法
        Method[] ms=c.getDeclaredMethods();
        for(Method m:ms){
            String name=m.getName();
            Class[] cs=m.getParameterTypes();
            Class result=m.getReturnType();
            System.out.println("方法:"+name+",参数:"+
                    Arrays.toString(cs)+",返回:"+result);
        }
        //获取单个方法 然后进行调用
        //c.getDeclaredMethod(方法名,可变长的方法参数)
        //test();
        //test("aa");
        //test("a",10,false);
        Method m1=c.getDeclaredMethod("test1");
        Method m2=c.getDeclaredMethod("test2",String.class,Integer.class);
        Method m3=c.getDeclaredMethod("test3",int.class,int.class);
        m2.setAccessible(true);//开启私有权限
        //调用方法  m1.invoke(对象,方法调用的实参)
        Person p=new Person(10);
        //p.test3(10,20);
        Object value1=m1.invoke(p);
        Object value2=m2.invoke(p,"姓名",18);
        Object value3=m3.invoke(p,10,20);
        System.out.println(value1+" "+value2+" "+value3);
    }
    //如果方法的参数 个数不确定(0--n个参数)
    //如果类型也不确定呢 可以定义Object
    //String  ... a 表示可变长参数(本质上就是数组)
    public static void test(Object ... a){
        for(int i=0;i<a.length;i++){
            System.out.println(a[i]);
        }
    }
}
